// CameraWin.cpp
#include "camerawin.h"
#include "ui_camerawin.h"
#include <QMessageBox>
#include <QThread>
#include <QDebug>
#include <QDir>
#include <QFileInfo>
#include <QDateTime> // 需要包含 QDateTime 头文件
#include <QPixmap>

CameraWin::CameraWin(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::CameraWin),
    m_cameraActive(false)
{
    ui->setupUi(this);

    // 初始化界面状态
    ui->cameraLab->setStyleSheet("background-color: black;");
    ui->cameraLab->setAlignment(Qt::AlignCenter);
    ui->closeCamera->setEnabled(false);
    ui->getImg->setEnabled(false);
}

CameraWin::~CameraWin()
{
    safeCameraShutdown();
    delete ui;
}

void CameraWin::on_openCamera_clicked()
{
    // 检查设备冷却时间（至少1秒间隔）
    if(m_releaseTimer.isValid() && m_releaseTimer.elapsed() < 1000) {
        QMessageBox::warning(this, "提示", "请等待设备资源释放完成");
        return;
    }

    if(m_cameraActive.load()) return;

    try {
        m_camera = new V4l2Api();
        connect(m_camera, &V4l2Api::sendImage, this, &CameraWin::handleFrame);

        // 原子状态标记必须在start()之前设置
        m_cameraActive.storeRelease(true);
        m_camera->start();

        // 更新界面状态
        ui->openCamera->setEnabled(false);
        ui->closeCamera->setEnabled(true);
        ui->getImg->setEnabled(true);

    } catch (...) {
        QMessageBox::critical(this, "错误", "视频设备初始化失败");
        safeCameraShutdown();
    }
}

void CameraWin::on_closeCamera_clicked()
{
    safeCameraShutdown();
}

void CameraWin::safeCameraShutdown()
{
    // 原子操作检查状态，防止重复调用
    if(!m_cameraActive.testAndSetOrdered(true, false)) return;

    /* 阶段1：线程终止流程 */
    if(m_camera) {
        // 断开所有信号连接
        disconnect(m_camera, 0, this, 0);

        // 强制终止线程（核心修复点）
        m_camera->requestInterruption();
        m_camera->terminate();  // 直接终止线程

        // 等待线程完全停止（1000ms超时）
        if(!m_camera->wait(1000)) {
            qWarning() << "线程终止超时，强制清理资源";
        }

        // 彻底释放摄像头对象（核心修复点）
        delete m_camera;
        m_camera = nullptr;  // 必须置空防止野指针
    }

    /* 阶段2：状态重置 */
    ui->cameraLab->clear();
    ui->openCamera->setEnabled(true);
    ui->closeCamera->setEnabled(false);
    ui->getImg->setEnabled(false);

    // 记录最后关闭时间
    m_releaseTimer.start();
}

void CameraWin::handleFrame(QImage frame)
{
    // 双重状态检查保证线程安全
    if(!m_cameraActive.load() || !m_camera) return;

    // 图像缩放显示（保持宽高比）
    QPixmap pix = QPixmap::fromImage(frame)
                      .scaled(ui->cameraLab->size(),
                              Qt::KeepAspectRatio,
                              Qt::SmoothTransformation);

    // 线程安全更新界面
    QMetaObject::invokeMethod(ui->cameraLab, [this, pix](){
        ui->cameraLab->setPixmap(pix);
    }, Qt::QueuedConnection);
}

void CameraWin::on_cameraBackBtn_clicked()
{
    safeCameraShutdown();
    emit jumpToWidget();
}

void CameraWin::on_getImg_clicked()
{
    // 获取当前采集的图像
    QImage currentFrame = ui->cameraLab->grab().toImage();

    if (currentFrame.isNull()) {
        QMessageBox::warning(this, "警告", "当前没有图像可以保存");
        return;
    }

    // 创建目录
    QString dirPath = QDir::currentPath() + QDir::separator() + "camera_img";
    QDir dir;
    if (!dir.exists(dirPath) && !dir.mkpath(dirPath)) {
        QMessageBox::critical(this, "错误", "无法创建目录");
        return;
    }

    // 生成唯一文件名
    QString fileName = dirPath + QDir::separator() +
                       "image_" + QString::number(QDateTime::currentSecsSinceEpoch()) + ".png";

    // 保存图像
    if (currentFrame.save(fileName)) {
        QMessageBox::information(this, "保存成功", "图像已保存到：" + fileName);

        // 创建分析对象
        QwenVL *analyzer = new QwenVL(this);

        // 连接原始响应信号
        // connect(analyzer, &QwenVL::analysisCompleted, [](const QString &rawJson){
        //     qDebug().noquote() << "\n=== 阿里云原始响应 ==="
        //                        << "\n" << rawJson
        //                        << "\n=====================\n";
        // });

        connect(analyzer, &QwenVL::analysisCompleted, this, [this](const QString &rawJson) {  // 注意添加this捕获
            // 解析JSON响应
            QJsonDocument doc = QJsonDocument::fromJson(rawJson.toUtf8());
            if (!doc.isNull() && doc.isObject()) {
                QJsonObject rootObj = doc.object();

                // 提取content字段
                if (rootObj.contains("choices") && rootObj["choices"].isArray()) {
                    QJsonArray choices = rootObj["choices"].toArray();
                    if (!choices.isEmpty()) {
                        QJsonObject firstChoice = choices[0].toObject();
                        if (firstChoice.contains("message") && firstChoice["message"].isObject()) {
                            QJsonObject message = firstChoice["message"].toObject();
                            if (message.contains("content")) {
                                QString content = message["content"].toString();

                                // 清理markdown格式
                                content.replace("**", "")  // 移除加粗符号
                                    .replace("\n\n", "\n"); // 优化换行

                                // 调试输出
                                qDebug().noquote() << "\n=== 阿里云内容 ==="
                                                   << "\n" << content.simplified();

                                // 更新UI文本框
                                ui->resultText->setPlainText(content); // 使用setPlainText避免HTML格式
                                qDebug() << "===================== (已更新到UI)";
                                return;
                            }
                        }
                    }
                }
            }
            ui->resultText->setPlainText("解析内容失败"); // 错误提示
            qDebug() << "[解析失败] 无法提取content字段";
        });

        // 连接错误信号
        connect(analyzer, &QwenVL::analysisFailed, [](const QString &error){
            qDebug() << "[识别错误]" << error;
        });

        // 自动释放对象
        connect(analyzer, &QwenVL::analysisCompleted, analyzer, &QwenVL::deleteLater);
        connect(analyzer, &QwenVL::analysisFailed, analyzer, &QwenVL::deleteLater);

        // 触发识别流程
        qDebug() << "=== 开始发送请求 ===";
        analyzer->analyzeImage(fileName);

    } else {
        QMessageBox::critical(this, "保存失败", "无法保存图像");
    }
}
